#Unity の Addressablesを使ってAWSのS3上のアセットデータをCloudFront経由でロードしてみた
こんにちは、ゲームソリューショングループの入井です。
Unityには、画像や3Dモデル等のアセットデータをゲーム本体とは別にビルドする機能があります。
ビルドしたアセットデータは、ゲームの実行中にインターネットを通して外部のサーバからダウンロードするように設定できます。アセットデータがゲーム本体から分離されることで、ゲーム本体サイズを小さく保ったり、ゲームの更新を行うこと無く新しいコンテンツの配信ができたりします。
今回は、UnityのAddressablesというシステムを使用して、Amazon S3のバケット内に保存したアセットデータをAmazon CloudFront経由でダウンロードし、ゲーム画面に表示する処理を実現してみました。
実行環境
- Unity 2021.3.16f
- Addressables 1.19.19
- UniVRM 0.108.0
実行手順
Addressablesのインストール及び有効化
アセットの管理やロードを行うために、AddressablesというUnityの機能を使います。以前はAssetBundleという機能でアセットの管理をしていたのですが、最近ではAddressablesが主流になってきているようです。
Addressablesを使用するためには、Package ManagerのUnity Registryを開き、Addressablesを選択してインストールします。
インストール完了後、Window → Asset Management → Addressables → Groupsとクリックします。
Addressables Groups ウィンドウが開いたら、Create Addressables Settings
をクリックすることで、Addressablesが使用できるようになります。
アセットデータのインポート、Addresablesへの登録
Addressablesで管理する対象のアセットデータをUnityにインポートします。
今回は、弊社の公式キャラクターである「めそ子」の3Dモデルデータを使用しました。
モデルデータはこちらからダウンロードできます。また、VRMファイルのインポートにはUniVRMを使用しました。
インポートしたデータのInspectorを見ると、Addressables
という項目ができています。チェックボックスを有効化することで、そのデータがAddressablesで管理されるようになります。
アセットデータ表示コード作成
アセットデータをAddresableseから読み込んでゲーム画面に表示するコードを書きます。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AddressableAssets; public class LoadAddressable : MonoBehaviour { async void Start() { var prefab = await Addressables.LoadAssetAsync<GameObject>("Assets/Methoko/methoko_1st.prefab").Task; Instantiate(prefab, new Vector3(0.0f, 0.0f , -8.0f), Quaternion.Euler(0f, 180f, 0f)); } void Update() { } }
LoadAssetAsync()
でアセットデータを読み込んでいます。引数のファイルパスは、先ほどのInspectorのAddressables欄のものと同じです。
読み込んだアセットデータは、Instantiate()
でゲームオブジェクトとして生成しています。座標と回転角度の情報も引数に渡し、生成場所を調整しています。
Start()
内にコードを書いているので、適当なEmpty Objectを作ってそれにこのコードのファイルをセットすれば、ゲーム開始とともにアセットデータを元にしたオブジェクトを画面上に生成する処理が走ります。
AWS S3, CloudFrontの設定
ここで一旦アセットデータを保存しておくための環境を設定しておきます。
AWSのマネジメントコンソールを開き、S3にてアセットデータ保管用のバケットを作成します。
S3だけでもアセットデータのHTTP配信は可能ですが、実際にはCDNサービスであるCloudFront経由での配信をするケースが多いと思われるので、CloudFrontのディストリビューションも作成し、S3と連携させます。
具体的な手順はこの記事では書きませんが、S3バケットのポリシーを設定するだけで簡単にCloudFront経由での配信が可能になります。
設定が完了したら、CloudFrontのURLを控えておきます。
Addressablesのビルド設定
Unityに戻り、上部メニューをWindow → Asset Management → Addressables → Profilesと開きます。
Profilesウィンドウ内のRemote欄でCustom
を選び、Remote.LoadPath欄に先ほど控えたCloudFrontのURLを入力します。
次に、上部メニューをWindow → Asset Management → Addressables → Groupsと開き、Addressables Groupsウィンドウ内で、Default Local Group (Default)
を選択します。その状態で、Inspector内のBuild & Load Paths欄でcustom
を選択し、Build Path欄でRemote.BuildPath
、Load Path欄でRemote.LoadPath
を選択します。
この設定により、Addresablesは指定したBuildPathにアセットデータのビルド結果を書き出します。そして、ゲーム実行の際は指定したLoadPath、つまりはCloudFrontのURLからアセットデータを読み込み、ゲーム内に展開するようになります。
アセットデータのビルド
上部メニューをWindow → Asset Management → Addressables → Groupsと開き、Addressables Groupsウィンドウ内でPlay Mode Scriptをクリックして、Use Existing Build
を選択すると、ゲーム実行時にビルドしたアセットデータを読み込むようになります。
同じくAddressables GroupウィンドウのBuild → New Build → Default Build Scriptをクリックすると、アセットデータのビルドが行われ、その結果がBuildPathに設定したパスへ書き出されます。
S3へのビルド結果アップロード
ローカルに書き出された2つの.bundleファイルをS3のバケットへアップロードします。
これで、リモートのアセットデータを読み込んでゲーム画面に表示する準備ができました。
実行結果
ゲームを実行すると、S3に保存されているめそ子の3Dモデルアセットデータが画面に表示されます。
まとめ
AWSのS3に保存されているアセットデータをCloudFront経由で読み込み、Unityゲーム画面上に表示させることができました。 この記事で扱った内容は簡単な例ですが、こういった機能をうまく活用することで、かさばりがちなアセットデータを効率的に管理していくことができるでしょう。